package com.woniuxy.amusementparkos.controller.lzw;

import com.woniuxy.amusementparkos.entity.lzw.ExtractMoneyInfo;
import com.woniuxy.amusementparkos.entity.lzw.ImprestInfo;
import com.woniuxy.amusementparkos.entity.lzw.Vaults;
import com.woniuxy.amusementparkos.exception.lzw.KnownException;
import com.woniuxy.amusementparkos.exception.lzw.unifyhanding.code.enumwarehouse.PublicEnumCode;
import com.woniuxy.amusementparkos.service.lzw.ExtractMoneyInfoService;
import com.woniuxy.amusementparkos.service.lzw.VaultsService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * 抽大钞(ExtractMoneyInfo)表控制层
 *     作用：用于抽大钞前台的一系列控制操作
 *     主要包括2个方面：
 *         1.抽大钞信息的列表展示（selectAll）
 *         2.录入抽大钞信息（insertExtractMoneyInfo）
 *     执行逻辑：
 *         1.列表展示：对抽大钞表及相关表进行查询（select）操作，通过List返回json数据
 *         2.录入信息：对抽大钞表进行插入（insert）操作，期间判断抽大钞去向是否为金库表（Vaults），
 *                   如果是，原表金额将加上抽大钞金额，执行更新（update）操作。
 *     其他方法：备用
 *
 * @author makejava
 * @since 2020-04-23 16:28:20
 */
@RestController
@RequestMapping("extractMoneyInfo")
public class ExtractMoneyInfoController {
    /**
     * 服务对象
     */
    @Resource
    private ExtractMoneyInfoService extractMoneyInfoService;

    /**
     * 金库
     */
    @Resource
    private VaultsService vaultsService;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne")
    public ExtractMoneyInfo selectOne(Integer id) {
        if(id==null){
            throw new KnownException(PublicEnumCode.NPE);
        }
        return this.extractMoneyInfoService.getById(id);
    }

    /**
     * 获取所有抽大钞信息
     *    实现逻辑：获取抽大钞表中对所有信息，并联合查询其所有对外键关联表
     *    作用：前台抽大钞需要实现抽大钞列表展示
     *
     * @return
     */
    @GetMapping("selectAll")
    public List<ExtractMoneyInfo> selectAll(){
        return this.extractMoneyInfoService.listAll();
    }

    /**
     * 备用金信息录入
     *      执行逻辑：向备用金信息表插入数据
     *      作用：前台完成备用金录入功能
     *
     * @param extractMoneyInfo 抽大钞相关数据
     */

    @PostMapping("insert")
    public void insertExtractMoneyInfo(ExtractMoneyInfo extractMoneyInfo){

        // TODO:异常处理未实现 （2019.4.23 19:16）

        System.out.println(extractMoneyInfo.getExtractMoneyDirFore());
        // 当备用金来自 金库 时：
        if(extractMoneyInfo.getExtractMoneyDirFore()==4){
            // 获取抽大钞金额
            BigDecimal extractMoney = extractMoneyInfo.getExtractMoneyAmount();
            // 查询金库总额
            Vaults countVault = this.vaultsService.getVault();
            // 计算：原金库 + 抽大钞金额 = 现金库金额
            BigDecimal subtract = countVault.getCash().add(extractMoney);
            // 插入金库
            Vaults vault = new Vaults();
            vault.setCash(subtract);
            this.vaultsService.update(vault);
        }else{
            /*
            当抽大钞 前往 其他柜台 时：
               大钞 --> 其他柜台 -- 以备用金形式 --> 存入备用金表
               整个现金流向，A柜台抽，B柜台取，A与B两端都需要有人手动录入，避免出现坏账现象
             */

        }

        // 插入抽大钞金额
        this.extractMoneyInfoService.insert(extractMoneyInfo);
    }
}